perm filename FSTDAC.MAC[EX2,LCS] blob sn#155837 filedate 1975-07-17 generic text, type T, neo UTF8
00100		NUM=↑D64		;NUMBER OF 128 WORD BLOCKS PER BUFFER
00200		TITLE	FSTDAC		;NICHOLAS VITULLI COLGATE U. 1973
00300		EXTERN	FNAM,FILBRK		;ROUTINE TO GET INPUT FILE
00400		INTERN	DEV			;NAME (DAVID HOFFMAN COLGATE)
00500		SIZE=200*NUM		;TOTAL SIZE OF EACH BUFFER
00600		STATUS=004000		;INTERRUPTS ON
00700		OFF=0		;STATUS BITS FOR DAC
00800		DONE=10
00900		BUSY=20
01000		MISS=40
01100		T=1		;TEMP ACC
01200		I=2		;ACC TO HOLD RELOCATION FACTOR
01300		SETUP=4		;ACC USED FOR INITIAL SETUP
01400		DSK=5		;INPUT CHANNEL
01500		B1=11		;RELOCATED IOWD FOR BUFFER 1
01600		B2=12		;RELOCATED IOWD FOR BUFFER 2
01700		IB1=13		;IOWD FOR BUFFER 1
01800		IB2=14		;IOWD FOR BUFFER 2
01900		IO=7		;ACC FOR TTY INPUT
02000	INDEX:	0		;SAVE RELOCATION FACTOR
02100	SAVET:	0		;SAVE ACC T DURING INTERRUPT ROUTINE
02200	MFLG:	0		;FLAG FOR DATA MISSED
02300	DFLG:	0		;FLAG FOR DONE
02400	TPOINT:	0		;NEXT IOWD FOR INTERRUPT ROUTINE
02500	WHATBF:	0		;BUFFER POINTER 0=BUFFER 2 -1=BUFFER 1
02600	INTBLK:	4,INTLOC		;↑C BLOCK
02700		2
02800		0
02900		0
03000	ADD1:	0		;INTERRUPT ROUTINE
03100	EXCHWD:	EXCH	I,INDEX		;GET RELOCATION FACTOR AND SAVE I
03200		MOVEM	T,SAVET(I)		;SAVE T
03300		SETCMM	WHATBF(I)		;POINT WHATBF TO NEXT BUFFER
03400		SKIPN	T,TPOINT(I)		;GET NEXT IOWD (RELOCATED)
03500		JRST	NODATA(I)		;IF 0 NO IOWD READY
03600		SETZM	TPOINT(I)		;ZERO IOWD
03700		MOVEM	T,POINTR(I)		;RESTORE BLKO POINTER
03800	RETURN:	MOVE	T,SAVET(I)		;RESTORE T
03900		EXCH	I,INDEX(I)		;RESTORE I AND INDEX
04000	JENWD:	JRSTF	@ADD1		;DISMISS INTERRUPT
04100	NODATA:	CONSZ	200,MISS		;CHECK FOR DATA MISSED
04200		SETOM	MFLG(I)			;YES RAISE MISSED FLAG
04300		CONO	200,OFF			;TURN OFF DAC
04400		SETOM	DFLG(I)			;RAISE DONE FLAG
04500		JRST	RETURN(I)		;RESTORE AND DISMISS
04600	ADD2:	0		;APR TRAP (ASSUME NEVER TO GET HERE)
04700	BP1:	BLOCK	2		;IOWD FOR BF1
04800	BP2:	BLOCK	2		;IOWD FOR BF2
04900	POINTR:	BLOCK	2		;IOWD FOR BLKO
05000	RTB:	XWD	1,ADD1		;RTBLK UUO SETUP TO GET ON PI 1.
05100		XWD	1,ADD2		;FSTBLK MODE
05200		CONSO	200,DONE
05300		BLKO	200,POINTR
05400		0
05500	RTBOFF:	BLOCK	4		;RTBLK UUO SETUP TO GET OFF PI
05600	BF1:	BLOCK	SIZE		;I/O BUFFER FOR SAMPLES
05700	BF2:	BLOCK	SIZE		;I/O BUFFER FOR SAMPLES
05800	STRT:	RESET
05900		MOVE	SETUP,[EXIT]		;DON'T ALLOW RESTART
06000		MOVEM	SETUP,STRT
06100	RETRY2:	JSA	16,FILBRK		;GET INPUT FILE NAME
06200		INIT	DSK,17			;DUMP MODE INPUT
06300	DEV:	0				;DEV FILLED BY FILBRK
06400		0
06500		JRST	[
06600		OUTSTR	[ASCIZ /CAN'T GET INPUT DEVICE?/]
06700		EXIT]				;EXIT ON DEVICE ERROR
06800		SKIPE	FNAM			;IF FILE NAME BLANK
06900		JRST	LKUP			;SET FILE NAME
07000		MOVE	SETUP,['MUSIC ']	;TO MUSIC.MUS
07100		MOVEM	SETUP,FNAM
07200		MOVSI	SETUP,'MUS'
07300		MOVEM	SETUP,FNAM+1
07400	LKUP:	LOOKUP	DSK,FNAM		;STORAGE FOR FNAME IN FILBRK
07500		JRST	[
07600		OUTSTR	[ASCIZ /?CAN'T FIND?/]
07700		JRST	RETRY2]		;GET NEW NAME ON LOOKUP ERROR
07800		OUTSTR	[ASCIZ /MODE? /]	;GET MODE FOR DAC OUTPUT
07900		INCHWL	IO			;PUT IN BITS 18+19 OF CONOWD
08000		SUBI	IO,60
08100		DPB	IO,[POINT 2,CONOWD,19]
08200		CLRBFI		;NO TYPE AHEAD
08300		OUTSTR	[ASCIZ /CLOCK? /]	;GET CLOCK RATE
08400		INCHWL	IO			;GET SELECT
08500		SUBI	IO,60			;PUT IN BITS 28+29
08600		DPB	IO,[POINT 2,CONOWD,29]
08700		INCHWL	IO			;GET DIVIDE
08800		SUBI	IO,60			;PUT IN BITS 20,21+22
08900		DPB	IO,[POINT 3,CONOWD,22]
09000		CLRBFI
09100	RETRY1:	MOVE	SETUP,[XWD 1,1]		;LOCK IN CORE
09200		LOCK	SETUP,			;ON ANY ERROR TYPE 'L'
09300		JRST	[
09400		OUTSTR	[ASCIZ /L/]
09500		INCHRS	IO
09600		JRST	RETRY1
09700		EXIT]	;TRY TO LOCK AGAIN, EXIT FROM RETRY LOOP ON TTY INPUT.
09800		OUTSTR	[ASCIZ /
09900	/]
10000		HRRZ	SETUP,SETUP		;GET RELOCATION FROM
10100		LSH	SETUP,9			;LOCK UUO (NORMALIZE)
10200		MOVEM	SETUP,INDEX		;STORE IN INDEX
10300		ADDM	SETUP,EXCHWD		;RELOCATE SOME INSTRUCTIONS
10400		ADDM	SETUP,JENWD
10500		MOVE	IB1,[IOWD SIZE,BF1]		;CREATE IOWD'S IN ACCS
10600		MOVE	IB2,[IOWD SIZE,BF2]		;FOR QUIT RESTORE
10700		MOVEM	IB1,BP1			;SET UP IOWD FOR FIRST READ
10800		MOVEM	IB1,POINTR		;CREATE IOWD FOR BLKO
10900		MOVEI	SETUP,INTBLK		;GRAB ↑C
11000		MOVEM	SETUP,134
11100		MOVEI	SETUP,RTB		;EXECUTE RTBLK UUO
11200		RTTRP	SETUP,
11300		JRST	[
11400		OUTSTR	[ASCIZ /?NCH?/]
11500		EXIT]				;EXIT ON ERROR
11600		MOVE	B1,POINTR		;GET RELOCATE IOWD FOR BUF1
11700		HRRZ	B2,POINTR		;MODIFY FOR BUF2
11800		ADDI	B2,SIZE
11900		HLL	B2,POINTR
12000		SETZM	MFLG		;LOWER MISSED FLAG
12100		SETZM	DFLG		;LOWER DONE FLAG
12200		SETZM	TPOINT		;ZERO NEXT IOWD
12300		SETZM	WHATBF		;POINT WHATBF TO BUFFER 2
12400		MOVEI	SETUP,1		;GET IN HPQ 1
12500		HPQ	SETUP,		;(HIGHER THAN NORMAL TIME SHARING)
12600		JRST	[
12700		OUTSTR	[ASCIZ /?CAN'T HPQ?
12800	/]
12900		JRST	XIT+1]		;EXIT GRACEFULLY ON ERROR
13000		IN	DSK,BP1		;FILL FIRST BUFFER FROM DSK
13100		SKIPA
13200		JRST	XIT		;ASSUME NULL FILE
13300		CONSZ	200,BUSY		;IS DAC ALREADY ON
13400		OUTSTR	[ASCIZ /?DAC IS ON?
13500	/]					;YES TELL USER
13600	CONOWD:	CONO	200,STATUS		;START DAC
13700	LOOP:
13800		SKIPE	DFLG		;IF DONE FLAG IS RAISED HERE - ERROR
13900		JRST	MISSED		;NEXT IOWD WAS NOT READY
14000		SKIPE	WHATBF		;WAIT FOR PERMISSION TO FILL BUFFER 2
14100		JRST	LOOP
14200		MOVEM	IB2,BP2		;RESTORE INPUT IOWD (NECESSARY FOR MTA)
14300		IN	DSK,BP2		;READ BUFFER
14400		SKIPA
14500		JRST	X1		;AT EOF WAIT FOR DONE FLAG
14600		MOVEM	B2,TPOINT		;RESTORE NEXT IOWD
14700	LOOP1:	SKIPE	DFLG		;SAME AS ABOVE BUT FOR BUFFER 1
14800		JRST	MISSED
14900		SKIPL	WHATBF
15000		JRST	LOOP1
15100		MOVEM	IB1,BP1
15200		IN	DSK,BP1
15300		SKIPA
15400		JRST	X1
15500		MOVEM	B1,TPOINT
15600		JRST	LOOP
15700	MISSED:	OUTSTR	[ASCIZ /
15800	?COULD NOT READ INPUT FAST ENOUGH?
15900	/]  ;NO NEXT POINTER, THE DONE FLAG WAS RAISED BUT MORE SAMPLES EXISTED.
16000	X1:	SKIPL	DFLG		;WAIT FOR DONE FLAG -- ALL SAMPLES READ
16100		JRST	.-1
16200		SKIPE	MFLG	;WAS DATA MISSED (SET IN INTERRUPT ROUTINE)
16300		OUTSTR	[ASCIZ /?DATA MISSED?
16400	/]				;YES -- TELL USER
16500		SKIPA
16600	XIT:	OUTSTR	[ASCIZ /?NULL FILE?/]		;TELL USER EOF ON FIRST READ
16700		MOVEI	SETUP,RTBOFF		;GET OFF PI
16800		RTTRP	SETUP,
16900		JFCL		;IGNORE ANY ERROR
17000		MOVE	SETUP,[XWD 1,1]		;UNLOCK
17100		UNLOK.	SETUP,
17200		JFCL		;IGNORE ANY ERRORS
17300		MOVEI	SETUP,0
17400		HPQ	SETUP,		;GET BACK TO TIMESHARING LEVEL
17500		JFCL		;IGNORE ANY ERRORS
17600		EXIT		;SAY HELLO TO MONITOR
17700	INTLOC:	CONO	200,OFF		;HERE ON ↑C -- TURN OF DEVICE
17800		JRST	XIT+1		;EXIT GRACEFULLY
17900		END	STRT